Ce notebook contient la phase d'exploration des variables du jeu de données des bâtiments de la ville de Seattle. Le but étant de modéliser la consommation d'énergie annuelle, un effort sera réalisé pour montrer la dépendance de cette variable cible avec les autres variables du jeu de données. Le jeu de données a été nettoyé au préalable afin de sélectionner les variables d'entrées pertinentes pour notre modélisation.
## traitement des données
import pandas as pd
import numpy as np
## visualisation avec Plotly
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio
import ipywidgets as ipw
import myutility.myfunction as myfunc
## template plotly pour la visualisation
pio.templates.default='seaborn'
L'échantillon de données contient 3370 bâtiments, renseignés par 26 variables.
## données 2016
data = pd.read_csv('dataset/2016-building-energy-benchmarking-cleaned.csv')
data.shape
On peut séparer les variables du jeu de données en trois catégories :
object)int64)float64)## ensembles des variables du dataset
data.dtypes.sort_values()
Le jeu de données contient des variables de type numérique (int64 & float64), et des variables de type catégorie (object).
La variable cible qui sera modélisée est la consommation d'énergie annuelle corrigée (SiteEnergyUseWN(kBtu)). On étudie dans cette étude exploratoire la relation des variables avec cette variable cible.
Le nombre de bâtiments renseignés pour chaque variable catégorielle est affiché ci-dessous. La plupart des variables catégorielles sont completement renseignées (n=3370).
listCategVar = data.dtypes == 'object'
listCategVar = listCategVar[listCategVar].index.tolist()
data[listCategVar].count()
Pour chaque variable catégorielle, on regroupe les modalités les moins fréquentes ($<5\%$) dans le groupe 'Other'. Cette technique va nous permettre de facilité la visualisation de ce type de variable
myfunc.gathercateg(data, dropna=False)
Pour chaque variable catégorielle, on affiche
piechart= {}
boxplot = {}
for categVar in listCategVar:
piefig = go.FigureWidget(px.pie(data, names=categVar, title=categVar,
color_discrete_sequence=px.colors.sequential.haline_r))
piefig.update_traces(sort=False,textinfo='percent+label',rotation=90, pull=0.03)
piefig.update_layout(width=400,showlegend=False, margin_r=130, margin_l=130)
boxfig = go.FigureWidget(px.box(data.sample(n=1000, random_state=2),
x=categVar, y='SiteEnergyUseWN(kBtu)', range_y=[-3e5,35e6]))
boxfig.update_layout(margin_b=50, margin_l=150,width=550)
boxfig.update_traces(marker_opacity=0)
piechart[categVar] = piefig
boxplot[categVar] = boxfig
ipw.HBox([piechart['NaturalGasAvailabe'], boxplot['NaturalGasAvailabe']])
Vue de Seattle, avec son importante diversité de batîments. Au premier plan : le quartier des affaires de la ville, Downtown Seatle (Wikipedia).
ipw.HBox([piechart['BuildingType'], boxplot['BuildingType']])
ipw.HBox([piechart['PrimaryPropertyType'], boxplot['PrimaryPropertyType']])

Carte de la ville de Seattle, divisée selon ses quartiers.
ipw.HBox([piechart['Neighborhood'], boxplot['Neighborhood']])
ipw.HBox([piechart['LargestPropertyUseType'], boxplot['LargestPropertyUseType']])
ipw.HBox([piechart['SecondLargestPropertyUseType'], boxplot['SecondLargestPropertyUseType']])
ipw.HBox([piechart['ThirdLargestPropertyUseType'], boxplot['ThirdLargestPropertyUseType']])
ipw.HBox([piechart['ComplianceStatus'], boxplot['ComplianceStatus']])
ipw.HBox([piechart['Outlier'], boxplot['Outlier']])
Le nombre de bâtiments renseignés pour chaque variable numérique disrète est affiché ci-dessous. Toutes les variables numériques discrètes sont completement renseignées (n=3370).
listDiscreteVar = data.dtypes == 'int64'
listDiscreteVar = listDiscreteVar[listDiscreteVar].index.tolist()
data[listDiscreteVar].count()
## Intervalle des x et binning des variables d'entrée
binsize = {}
binsize['YearBuilt'] = {'start' : 1900.0, 'end' : 2015.0, 'size' : 5}
binsize['PropertyGFATotal'] = {'start' : 0.0, 'end' : 300000.0, 'size' : 20000}
binsize['PropertyGFABuilding(s)'] = {'start' : 0.0, 'end' : 300000.0, 'size' : 20000}
binsize['PropertyGFAParking'] = {'start' : 0.0, 'end' : 30000.0, 'size' : 2000}
for elt in binsize:
nameFlooredVar = elt + 'Floor' + str(binsize[elt]['size'])
data[nameFlooredVar] = (data[elt] - data[elt] % 5)
figDhist = {}
figDbox = {}
for elt in binsize:
## histogram, variable d'entrée (x)
figDhist[elt] = go.FigureWidget(px.histogram(data, x=elt))
figDhist[elt].update_traces(xbins=binsize[elt], opacity=.85)
figDhist[elt].update_layout(width=480, #margin_r=100,
xaxis=dict(
range=[binsize[elt]['start'] - binsize[elt]['size'] / 2, binsize[elt]['end']])
)
## nouvelle colonne où on discretise les valeurs (pas = taille de bin)
nameFlooredVar = elt + 'Floor' + str(binsize[elt]['size'])
data[nameFlooredVar] = (data[elt] - data[elt] % binsize[elt]['size'])
## intervalle des x
min_x = binsize[elt]['start'] - binsize[elt]['size'] / 2
max_x = binsize[elt]['end'] + binsize[elt]['size'] / 2
## box plot, Mediane[variable cible] (y) versus Variable d'entrée (x)
figDbox[elt] = go.FigureWidget(px.box(data, y='SiteEnergyUseWN(kBtu)', x=nameFlooredVar,
range_y= [-30e4,25e6], range_x=[min_x, max_x]))
figDbox[elt].update_traces(marker_opacity=0)
figDbox[elt].update_layout(width=480, xaxis_title_text = elt
# , margin_l=50
)
data.drop(nameFlooredVar, axis='columns') ## supprime la colonne floored
ipw.HBox([figDhist['YearBuilt'], figDbox['YearBuilt']])
ipw.HBox([figDhist['PropertyGFATotal'], figDbox['PropertyGFATotal']])
ipw.HBox([figDhist['PropertyGFABuilding(s)'], figDbox['PropertyGFABuilding(s)']])
ipw.HBox([figDhist['PropertyGFAParking'], figDbox['PropertyGFAParking']])
Le nombre de bâtiments renseignés pour chaque variable numérique continue est affiché ci-dessous. La plupart des variables numériques continues sont presque completement renseignées (n=3370).
listContinuousVar = data.dtypes == 'float64'
listContinuousVar = listContinuousVar[listContinuousVar].index.tolist()
data[listContinuousVar].count()
px.histogram(data, x='NumberofFloors')
px.histogram(data, x='LargestPropertyUseTypeGFA')
px.histogram(data, x='SecondLargestPropertyUseTypeGFA')